package net.crozz.openapi.weibo;

import net.crozz.openapi.ApiException;
import net.crozz.openapi.http.Param;
import net.crozz.openapi.http.Requester;
import net.crozz.openapi.weibo.model.short_url.*;

import java.util.ArrayList;
import java.util.List;

public class Short_url {

    private Requester client;
    private String    baseURL;

    Short_url(Requester client, String baseURL) {
        this.client = client;
        this.baseURL = baseURL;
    }

    /**
     * 将一个或多个长链接转换成短链接<br/>
     * http://open.weibo.com/wiki/2/short_url/shorten
     *
     * @param url_long     需要转换的长链接，需要URLencoded，最多不超过20个
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     */
    public Resp_shorten shorten(String source, String access_token, String... url_long) throws ApiException, ApiException {
        List<Param> params = new ArrayList<Param>();
        params.add(Param.newParam("source", source));
        params.add(Param.newParam("access_token", access_token));
        for (String i : url_long) {
            params.add(Param.newParam("url_long", i));
        }
        return client.getObj(
                Resp_shorten.class,
                baseURL + "short_url/shorten.json",
                params.toArray(new Param[params.size()])
        );
    }

    /**
     * 将一个或多个短链接还原成原始的长链接<br/>
     * http://open.weibo.com/wiki/2/short_url/expand
     *
     * @param url_short 需要还原的短链接，需要URLencoded，最多不超过20个
     */
    public Resp_expand expand(String source, String access_token, String... url_short) throws ApiException {
        List<Param> params = new ArrayList<Param>();
        params.add(Param.newParam("source", source));
        params.add(Param.newParam("access_token", access_token));
        for (String i : url_short) {
            params.add(Param.newParam("url_short", i));
        }
        return client.getObj(
                Resp_expand.class,
                baseURL + "short_url/expand.json",
                params.toArray(new Param[params.size()])
        );
    }


    /**
     * 获取短链接在微博上的微博分享数<br/>
     * http://open.weibo.com/wiki/2/short_url/share/counts
     *
     * @param url_short 需要取得分享数的短链接，需要URLencoded，最多不超过20个
     */
    public Resp_share_counts counts(String source, String access_token, String... url_short) throws ApiException {
        List<Param> params = new ArrayList<Param>();
        params.add(Param.newParam("source", source));
        params.add(Param.newParam("access_token", access_token));
        for (String i : url_short) {
            params.add(Param.newParam("url_short", i));
        }
        return client.getObj(
                Resp_share_counts.class,
                baseURL + "short_url/share/counts.json",
                params.toArray(new Param[params.size()])
        );
    }

    /**
     * 获取包含指定单个短链接的最新微博内容<br/>
     * http://open.weibo.com/wiki/2/short_url/share/statuses
     *
     * @param url_short 需要取得关联微博评论内容的短链接，需要URLencoded
     * @param since_id  若指定此参数，则返回ID比since_id大的评论（即比since_id时间晚的评论），默认为0。
     * @param max_id    若指定此参数，则返回ID小于或等于max_id的评论，默认为0。
     * @param count     单页返回的记录条数，默认为50，最多不超过200。
     * @param page      返回结果的页码，默认为1。
     */
    public Resp_share_statuses statuses(String source, String access_token, String url_short, Long since_id, Long max_id, Integer count, Integer page) throws ApiException {
        return client.getObj(
                Resp_share_statuses.class,
                baseURL + "short_url/share/statuses.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("url_short", url_short),
                Param.newParam("since_id", since_id),
                Param.newParam("max_id", max_id),
                Param.newParam("count", count),
                Param.newParam("page", page)
        );
    }

    /**
     * 获取短链接在微博上的微博分享数<br/>
     * http://open.weibo.com/wiki/2/short_url/comment/counts
     *
     * @param url_short 需要取得分享数的短链接，需要URLencoded，最多不超过20个
     */
    public Resp_comment_counts comment_counts(String source, String access_token, String... url_short) throws ApiException {
        List<Param> params = new ArrayList<Param>();
        params.add(Param.newParam("source", source));
        params.add(Param.newParam("access_token", access_token));
        for (String i : url_short) {
            params.add(Param.newParam("url_short", i));
        }
        return client.getObj(
                Resp_comment_counts.class,
                baseURL + "short_url/comment/counts.json",
                params.toArray(new Param[params.size()])
        );
    }

    /**
     * 获取包含指定单个短链接的最新微博评论<br/>
     * http://open.weibo.com/wiki/2/short_url/comment/comments
     *
     * @param url_short 需要取得关联微博评论内容的短链接，需要URLencoded
     * @param since_id  若指定此参数，则返回ID比since_id大的评论（即比since_id时间晚的评论），默认为0。
     * @param max_id    若指定此参数，则返回ID小于或等于max_id的评论，默认为0。
     * @param count     单页返回的记录条数，默认为50，最多不超过200。
     * @param page      返回结果的页码，默认为1。
     */
    public Resp_comment_comments comment_comments(String source, String access_token, String url_short, Long since_id, Long max_id, Integer count, Integer page)
            throws ApiException {
        return client.getObj(
                Resp_comment_comments.class,
                baseURL + "short_url/comment/comments.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("url_short", url_short),
                Param.newParam("since_id", since_id),
                Param.newParam("max_id", max_id),
                Param.newParam("count", count),
                Param.newParam("page", page)
        );
    }

}
